////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Το παρόν περιέχει γενικές δομές και μεθόδους που αφορούν τόσο στον server
// όσο και στους clients, αλλά είναι εξειδικευμένες στη «Βίδα». Όλα τα
// σχετικά εντάσσονται στο singleton "Vida".

Vida = {
	// Η property "thesiMax" δείχνει τον μέγιστο αριθμό θέσης στο τραπέζι.
	// Μπορεί να φαίνεται υπερβολικό, αλλά αποδεικνύεται χρήσιμο και πολύ
	// βολικό.

	thesiMax: 4,

	// Χρησιμοποιούμε το associative array "thesiValid" για να διατρέχουμε
	// τις θέσεις του τραπεζιού (η σειρά δεν είναι εγγυημένη από τη γλώσσα).
	// Το array θα συμπληρωθεί αυτόματα κατά το startup.

	thesiValid: {},

	// Η μέθοδος "isThesi" δέχεται ένα όρισμα και ελέγχει αν το όρισμα αυτό
	// είναι δεκτό ως θέση τραπεζιού.

	isThesi: function(thesi) {
		return Vida.thesiValid[thesi];
	},

	// Η μέθοδος "oxiThesi" δέχεται ένα όρισμα και ελέγχει αν το όρισμα αυτό
	// είναι απαράδεκτο ως θέση τραπεζιού.

	oxiThesi: function(thesi) {
		return !Vida.isThesi(thesi);
	},

	// Οι παράμετροι στη λίστα "peparamProsopiki" αφορούν μόνο τον παίκτη τής
	// παραμέτρου και ως εκ τούτου κοινοποιούνται ΜΟΝΟ στον συγκεκριμένο παίκτη.

	peparamProsopiki: {
		'ΠΑΡΑΣΚΗΝΙΟ': true,
	},

	peparamIsProsopiki: function(param) {
		return Vida.peparamProsopiki[param];
	},

	// Οι παράμετροι στη λίστα "peparamKrifi" αφορούν τον παίκτη τής παραμέτρου
	// και κοινοποιούνται ΜΟΝΟ στον συγκεκριμένο παίκτη ΚΑΙ σε βαθμοφόρους από
	// διαχειριστές και άνω.

	peparamKrifi: {
		'ΑΞΙΩΜΑ': true,
		'DEVELOPER': true,
	},

	peparamIsKrifi: function(param) {
		return Vida.peparamKrifi[param];
	},

	peparamOxiKrifi: function(param) {
		return !Vida.peparamIsKrifi(param);
	},

	// Ακολουθεί λίστα με τις default τιμές των παραμέτρων παίκτη.

	peparamDefault: {
		'ΑΞΙΩΜΑ': 'ΘΑΜΩΝΑΣ',
		'ΚΑΤΑΣΤΑΣΗ': 'ΔΙΑΘΕΣΙΜΟΣ',
		'ΠΛΑΤΗ': 'ΜΠΛΕ',
		'ΠΑΡΑΣΚΗΝΙΟ': 'standard.png',
		'DEVELOPER': 'ΟΧΙ',
		'ΤΡΑΠΟΥΛΑ': 'jfitz',
	},
};

Vida.thesiWalk = function(callback) {
	var thesi;

	for (thesi = 1; thesi <= Vida.thesiMax; thesi++)
	callback(thesi);

	return Vida;
}

// Συμπληρώνουμε τώρα το array "thesiValid" με τις δυνατές θέσεις παίκτη.

Vida.thesiWalk(function(thesi) {
	Vida.thesiValid[thesi] = parseInt(thesi);
});

// Η function "peparamIsTrivial" δέχεται το είδος και την τιμή παραμέτρου
// παίκτη, και επιστρέφει true εφόσον ο συνδυασμός είναι default.

Vida.peparamIsTrivial = function(param, timi) {
	return(timi === Vida.peparamDefault[param]);
};

// Η μέθοδος "epomeniThesi" εφαρμόζεται πάνω στη θέση κάποιου παίκτη και
// επιστρέφει την επόμενη θέση.

Number.prototype.epomeniThesi = function() {
	var thesi;

	thesi = this.valueOf();

	if (Vida.oxiThesi(thesi))
	return null;

	return((thesi % Vida.thesiMax) + 1);
};

String.prototype.epomeniThesi = function() {
	return parseInt(this.valueOf()).epomeniThesi();
};

// Η μέθοδος "isDexia" εφαρμόζεται πάνω στη θέση κάποιου παίκτη και επιστρέφει
// true αν η θέση αυτή βρίσκεται δεξιά από τη θέση που περνάμε ως παράμετρο.

Number.prototype.isDexia = function(thesi) {
	return(this.valueOf() === thesi.epomeniThesi());
};

String.prototype.isDexia = function(thesi) {
	return parseInt(this.valueOf()).isDexia(thesi);
};

// Η μέθοδος "isAristera" εφαρμόζεται πάνω στη θέση κάποιου παίκτη και επιστρέφει
// true αν η θέση αυτή βρίσκεται αριστερά από τη θέση που περνάμε ως παράμετρο.

Number.prototype.isAristera = function(thesi) {
	return(this.epomeniThesi() === thesi.valueOf());
};

String.prototype.isAristera = function(thesi) {
	return parseInt(this.valueOf()).isAristera(thesi);
};

// Η μέθοδος "isApenanti" εφαρμόζεται πάνω στη θέση κάποιου παίκτη και επιστρέφει
// true αν η θέση αυτή βρίσκεται απέναντι από τη θέση που περνάμε ως παράμετρο.

Number.prototype.isApenanti = function(thesi) {
	return(this.valueOf() === thesi.epomeniThesi().epomeniThesi());
};

String.prototype.isApenanti = function(thesi) {
	return parseInt(this.valueOf()).isApenanti(thesi);
};

String.prototype.isPektis = function() {
	return(this.valueOf() === 'ΠΑΙΚΤΗΣ');
}

String.prototype.oxiPektis = function() {
	return !this.isPektis();
}

String.prototype.isTheatis = function() {
	return(this.valueOf() === 'ΘΕΑΤΗΣ');
}

String.prototype.oxiTheatis = function() {
	return !this.isTheatis();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Παραλλάσσουμε τη λίστα περιγραφικών ονομάτων των φυλών παιγνιοχάρτων,
// προκειμένου αυτές να εμφανίζονται στα ελληνικά.

filajs.suitDesc = {
	S:	'ΜΠΑΣΤΟΥΝΙΑ',
	C:	'ΣΠΑΘΙΑ',
	D:	'ΚΑΡΑ',
	H:	'ΚΟΥΠΕΣ',
};

Vida.axiaValue = {
	7:	0,
	8:	0,
	9:	0,
	T:	10,
	J:	2,
	Q:	3,
	K:	4,
	A:	11,
};

Vida.axiaValueAtou = {
	7:	0,
	8:	0,
	9:	14,
	T:	10,
	J:	20,
	Q:	3,
	K:	4,
	A:	11,
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Dilosi = function(props) {
	if (typeof props !== 'string') {
		Globals.initObject(this, props);
		return this;
	}

	switch (props.valueOf()) {
	case 'P':
		return this.pasoSet();
	case 'V':
		return this.vidaSet();
	}

	this.xromaSet(props.substr(0, 1));
	this.pontoiSet(parseInt(props.substr(1)));
};

Dilosi.prototype.dilosiXromaSet = function(xroma) {
	this.xroma = xroma;
	return this;
};

Dilosi.prototype.dilosiXromaGet = function() {
	return this.xroma;
};

Dilosi.prototype.dilosiPontoiSet = function(pontoi) {
	this.pontoi = pontoi;
	return this;
};

Dilosi.prototype.dilosiPontoiGet = function() {
	return this.pontoi;
};

Dilosi.prototype.dilosiPasoSet = function() {
	this.paso = true;
	return this;
};

Dilosi.prototype.dilosiIsPaso = function() {
	return this.paso;
};

Dilosi.prototype.dilosiOxiPaso = function() {
	return !this.dilosiIsPaso();
};

Dilosi.prototype.dilosiVidaSet = function() {
	this.vida = true;
	return this;
};

Dilosi.prototype.dilosiIsVida = function() {
	return this.vida;
};

Dilosi.prototype.dilosiOxiVida = function() {
	return !this.dilosiIsVida();
};

String.prototype.string2dilosi = function() {
	return new Dilosi(this.valueOf());
};

// Η μέθοδος "dilosi2string" είναι σημαντική, καθώς μετατρέπει κάποια δήλωση
// αγοράς σε string της μορφής "XNNN", όπου:
//
//	X	Είναι το χρώμα, ήτοι "S" μπαστούνια, "C" σπαθιά, "D" καρά, και
//		"H" κούπες.
//
//	NNN	Οι πόντοι, π.χ. 90, 120 κλπ.
//
// Υπάρχουν και κάποιες ειδικές δηλώσεις που δεν εμπίπτουν στην ανωτέρω λογική
// και αυτές είναι:
//
//	P	Σημαίνει «πάσο»
//
//	V	Σημαίνει «βίδα»

Dilosi.prototype.dilosi2string = function() {
	if (this.dilosiIsPaso())
	return 'P';

	if (this.dilosiIsVida())
	return 'V';

 	return this.xromaGet() + '' + this.pontoiGet();
};

Dilosi.prototype.dilosiLektiko = function() {
	if (this.dilosiIsPaso())
	return 'ΠΑΣΟ';

	if (this.dilosiIsVida())
	return 'ΒΙΔΑ';

	return this.dilosiPontoiGet() + ' ' + this.dilosiXromaGet().filajsSuitDesc();
};
